//designpatterns.factorymethod.XMLUtil.java
package factorymethod;

import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;

public class XMLUtil {
	/**
	 * 该方法用于从XML配置文件中提取具体类类名，并返回一个实例对象
	 *
	 * @return 从XML配置文件中指定类名创建的实例对象，如果发生异常则返回 null
	 */
	public static Object getBean() {
		try {
			// 创建DOM文档对象
			// 创建一个DocumentBuilderFactory实例，用于创建DocumentBuilder
			DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
			// 通过DocumentBuilderFactory创建一个DocumentBuilder对象，用于解析XML文档
			DocumentBuilder builder = dFactory.newDocumentBuilder();
			// 声明一个Document对象，用于表示整个XML文档
			Document doc;
			// 解析指定的XML文件，将其内容加载到Document对象中
			doc = builder.parse(new File("src//factorymethod//config.xml"));

			// 获取包含类名的文本结点
			// 通过标签名 "className" 获取所有匹配的元素节点列表
			NodeList nl = doc.getElementsByTagName("className");
			// 获取节点列表中的第一个节点，并获取其第一个子节点
			Node classNode = nl.item(0).getFirstChild();
			// 获取该子节点的节点值，即类名
			String cName = classNode.getNodeValue();

			// 通过类名生成实例对象并将其返回
			// 根据类名获取对应的Class对象
			Class<?> c = Class.forName(cName);
			// 通过Class对象创建类的实例
			Object obj = c.getDeclaredConstructor().newInstance();
			return obj;
		}
		// 捕获所有异常
		catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

}